#include <my_header.h>

/* Usage: ./3_circulation_read */
int main(int argc, char *argv[]){                                  
    ARGS_CHECK(argc, 2);
    int fd = open(argv[1], O_RDWR);
    ERROR_CHECK(fd, -1, "open");

    char buf[6] = { 0 };    // 用于存储读取到的数据
    ssize_t read_out;   // ssize_t 长整型
                        
    // 循环读取文件直到文件末尾或出错
    // sret为0时表示读到文件末尾，sret为-1时表示read出错，
    // 这两种情况都会结束循环

    // 循环读取
    while((read_out = read(fd, buf, sizeof(buf) - 1) > 0)){
        printf("read_out = %ld, buf = %s\n", read_out, buf);
        memset(buf, 0, sizeof(buf));    // 清空缓冲区以准备下一次读取
    }// 当 read_count 为 0（表示到达文件末尾）或者是
    // 负值（表示发生了错误）时，循环将停止。
    // 检查是否因为读取出错位退出循环
    
    // 检查读取是否到达文件末尾（read_count == 0）或发生
    // 错误（read_count < 0） 
    if(read_out < 0)
    {
        printf("Failed to read file");
    }else if(read_out == 0)
    {
        printf("Reached end of file.\n");
    }

    // 关闭文件描述符
    close(fd);
    return 0;
}

#if 0
read读磁盘文件的时候，是一个没有阻塞的读过程。这个过程中，
数据始终从内核区域流向用户区域：

一开始磁盘文件的待读取数据还比较充足，read函数能够正常读到
参数count个字节。
最后一次read数据，读到文件末尾时，read函数已经无法读到参
数count个字节了。
read到达末尾后，继续read，read并不会阻塞，而是返回0。
如果read的过程中出错，read也不会阻塞，而是返回-1。
所以依据依据read磁盘文件这样的特点，我们可以以> 0作为一个
循环的条件，轻松实现循环读完一整个文件中的数据。
#endif
